<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 
    // 函数中this的指向，不取决于他的定义，只取决于他的调用
    // 

    // 普通函数 
      // 调用  函数名（）
      //  默认指向window
    function fun(x,y) {
      console.log(1);
      console.log(this);
      console.log(x+y);
    }
    // 构造函数 
      // 通过new关键字得到函数对象
      // this默认指向的是构造函数
    function fun1(name) {
      this.name = name;
    }
    // 字面量 
      // 对象名，方法名
      // 默认指向的是调用者
    var bbo = {
      name : "hk",
      aihao : function () {
        fun();
        console.log(3);
        console.log(this.name);
        // setInterval(function () {
        //   console.log(this);
        // },1000)
      },
      fn : fun,
    }
    bbo.aihao()
    bbo.fn(1,1)//this指向bbo
    // 事件函数
    // 默认指向的是事件源
    document.onclick = function () {
      console.log(4);
      console.log(this);
    }
    // 定时函数
    // 默认指向的是window
    setInterval(function () {
      console.log(5);
      console.log(this);
    },100000000000)


      // 练习1
      // var a = 1;
      // function foo() {
      //   var a = 2;
      //   function inner() {
      //     console.log(this.a);
      //   }
      //   inner();
      // }
      // foo();//

      // 练习2
    //   var a = 1;
    //   function s() {
    //     var a = 2;
    //     return function () {
    //       console.log(this);
    //       console.log(this.a);
    //     }
    //   }
    // var s1 = s();
    // s1();
    // s()();

    // 练习3
    function foo() {
      console.log(this.a); // 2
    }
    function dofoo(fn) {
      console.log(this);//window 
      fn();
    }
    var obj = {a:1,foo};
    var a = 2;
    dofoo(obj.foo);
  </script>
</body>
</html>